<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    /**
     * 模拟实现 Object.assign 方法，将源对象(sources)的可枚举属性复制到目标对象(target)
     * @param {Object} target - 目标对象，用于接收源对象的属性
     * @param {...Object} sources - 源对象集合，提供待复制的属性
     * @returns {Object} 处理后的目标对象
     * @throws {Error} 当 target 为 null 或 undefined 时抛出错误
     */
    function myObjectAssign(target,...sources){
        // 校验目标对象合法性（null 和 undefined 的检测）
        if(typeof target === 'null' || typeof target === 'undefined'){
            throw new Error('Cannot convert undefined or null to object')
        }

        // 将原始值目标对象转换为包装对象
        const to = Object(target)

        // 遍历处理所有源对象
        for(const source of sources){
            // 获取当前源对象的自身可枚举属性键名
            const keys = Object.keys(source)

            // 将源对象的属性复制到目标对象
            keys.forEach(key=>{
                to[key] = source[key]
            })
        }

        return to
    }

    const target = { a: 1 };
    const source1 = { b: 2 };
    const source2 = { c: 3 };

    const result = myObjectAssign(target, source1, source2);
    console.log(result); // { a: 1, b: 2, c: 3 }
    console.log(target); // { a: 1, b: 2, c: 3 }（目标对象被修改）
</script>
</html>